﻿using MaterialDesignThemes.Wpf;
using Prism.Ioc; // 引入Prism的依赖注入容器相关命名空间
using Prism.Mvvm; // 引入Prism的MVVM相关命名空间
using Prism.Services.Dialogs; // 引入Prism的对话框服务相关命名空间 
using System.Windows; // 引入WPF基础命名空间

namespace WPF.Core // 定义WPF核心命名空间
{
    // 定义一个扩展的对话框服务接口
    public interface IHostDialogService : IDialogService
    {
        // 异步显示对话框方法，返回对话框结果
        Task<IDialogResult> ShowDialogAsync(string pageName, IDialogParameters parameters = null, string identifier = "Root");
    }

    // 定义一个扩展的对话框感知接口
    public interface IHostDialogAware : IDialogAware
    {
        // 对话框标识符属性
        string identifier { get; set; }
    }

    // 实现扩展的对话框服务类
    public class HostDialogService : DialogService, IHostDialogService
    {
        // 依赖注入容器扩展，用于解析依赖对象
        private readonly IContainerExtension containerExtension;

        // 构造函数，通过依赖注入获取容器扩展
        public HostDialogService(IContainerExtension containerExtension)
            : base(containerExtension)
        {
            this.containerExtension = containerExtension;
        }

        // 实现异步显示对话框方法
        public async Task<IDialogResult> ShowDialogAsync(string pageName, IDialogParameters parameters = null, string identifier = "Root")
        {
           var dialogContent = GetDialogCotent(pageName, identifier);
            if(!(dialogContent.DataContext is IHostDialogAware vm))
            {
                throw new Exception("");
            }

            var eventHandler = GetDialogOpenedEventHandler(vm , parameters);

            var dialogIsOpen = DialogHost.IsDialogOpen(identifier);
            if (dialogIsOpen) return new DialogResult(ButtonResult.Ignore);

            var dialogResult = await DialogHost.Show(dialogContent, identifier, eventHandler);

            if(dialogResult == null)
            {
                 return new DialogResult(ButtonResult.Cancel);
            }

            return (IDialogResult)dialogResult;

        }

        

        // 获取对话框内容的私有方法
        private FrameworkElement GetDialogCotent(string name, string identifier = "Root")
        {
            // 通过容器扩展解析对话框内容对象
            var content = containerExtension.Resolve<object>(name);

            // 检查解析对象是否为FrameworkElement类型
            if (!(content is FrameworkElement dialogContent))
                throw new NotImplementedException("");

            // 检查对话框内容t是否为FrameworkElement且为空，如果是则自动绑定ViewModel
            if (dialogContent is FrameworkElement view && view.DataContext is null && ViewModelLocator.GetAutoWireViewModel(view) is null)
            {
                ViewModelLocator.SetAutoWireViewModel(view, true);
            }

            // 检查对话框内容的DataContext是否为IHostDialogAware类型，如果不是则抛出未实现异常
            if (!(dialogContent.DataContext is IHostDialogAware vm))
                throw new NotImplementedException("");

            // 设置对话框标识符
            vm.identifier = identifier;

            // 返回对话框内容
            return dialogContent;
        }

        // 定义一个私有方法，用于获取一个DialogOpenedEventHandler委托实例
        private DialogOpenedEventHandler GetDialogOpenedEventHandler(IHostDialogAware vm , IDialogParameters parameters)
        {
            // 如果传入的parameters为null，则初始化一个新的DialogParameters对象
            if(parameters == null) parameters = new DialogParameters(); 

            // 创建一个DialogOpenedEventHandler委托实例，该委托将在对话框打开时被调用
            DialogOpenedEventHandler eventHandler = (dialog, e) => 
            { 
                // 获取当前对话框会话的内容
                var content =  e.Session.Content;

                // 检查传入的vm是否实现了IHostDialogAware接口
                if(vm is IHostDialogAware aware)
                {
                    // 调用IHostDialogAware接口的OnDialogOpened方法，传入parameters
                    aware.OnDialogOpened(parameters); 
                }

                // 更新对话框会话的内容为之前获取的内容
                e.Session.UpdateContent(content);
            
            };

            // 返回创建的DialogOpenedEventHandler委托实例
            return eventHandler;
        }
    }
}